home *** CD-ROM | disk | FTP | other *** search
MarxMenu script | 1991-04-07 | 16.5 KB | 678 lines |
- Comment
- ========================================================
-
- Copyright 1990 by Marc Perkel * All right reserved.
-
- MarxMenu now allows you to login to a Novell network without using
- Novell's login program or messing with nasty login scripts. You can
- be in MarxMenu all the way in.
-
- Logging into Novell is tricky. Especially if you are using boot roms
- on your network cards. Through much trial and error, I have found
- some solid tricks that make life easier.
-
- You should have the following two BATCH files in your LOGIN
- directory as follows:
-
- LOADNET.BAT
- -----------
- NET4
- F:
- STARTUP
-
- STARTUP.BAT
- -----------
- SET BOOTUP=LOGIN
- MarxMenu Login
- %BOOTUP%
-
- Each workstation should have their own AUTOEXEC.BAT. The last line
- should be LOADNET. If you are running multiple versions of dos you
- can have the first line of LOADNET.BAT be %NET%. You will then have
- to have SET NET=NET4 in your AUTOEXEC.BAT file.
-
- Also, if you want automatic login you can add the following lines:
-
- SET USERNAME=MARC Your Name Here
- SET PASSWORD=NERD Your Password Here
-
- You should also change the COMSPEC= to the network command.com BEFORE
- you run NET4. For some unknown reason, this solves a lot of problems.
-
- Example:
-
- IPX
- SET COMSPEC=Y:COMMAMD.COM
- NET4
-
- Another boot rom quirk is that you can't run any program off a boot
- rom that trashes upper memory. An example is running QEMM on a
- monochrome monitor.
-
- By using this method the boot disk or boot rom hands control over in
- a clean way. LOADNET.BAT then branches to STARTUP.BAT for the rest
- of the login sequence.
-
- For some strange reason which I can't explain, LOADNET and STARTUP
- have to be two separate batch files. I think it forces the transient
- part of COMMAND.COM to load into memory. Anyhow, don't combine these
- into one batch file
-
- The first line of STARTUP.BAT is a message that tells this menu that
- the user is logging in for the first time. This menu creates a batch
- file and puts the name of it in the environment variable BOOTUP.
- STARTUP.BAT then executes this file.
-
- This is the example for MY network. You'll have to modify it for
- yours.
-
- One word of caution. After modifing this menu, always run MARXCOMP
- LOGIN to compile it. Otherwise, if you boot up into it you won't
- have enough access rights to recompile automatically.
-
- ========================================================
- EndComment
-
- var
- UserName
- OldPass
- NewPass
- Logged
- Station
- NetAddress
- SmartDir
- MyServer
- HomeDir
- DosDir
- BatName
- BatFile
- UseMarxLogin
- Shell
- PasswordExpDays
- SkipError
-
- Comment
- ========================================================
-
- If UseMarxLogin is set to true then this program will use the MarxMenu
- API call to log into the network. If set to false the it will shell
- Novell's LOGIN.EXE program.
-
- If UseMarxLogin is set to true, and you are using 386 NetWare then you
- will have to add the following command to your AUTOEXEC.NCF file:
-
- SET ALLOW UNENCRYPTED PASSWORDS = ON
-
- ========================================================
- EndComment
-
- UseMarxLogin = True
-
- Shell = CleanFileName(ReadEnv('COMSPEC'))
- MyServer = NovDefaultServer
-
- Comment
- ========================================================
-
- If Environment variables USERNAME and PASSWORD are set, this menu
- will attempt to log into the network using these values. This allows
- for automatic login. You can also pass the parameters on the command
- line as follows.
-
- MarxMenu Login <Name> <Password>
-
- The name may contain a referrence to a server: Server/Name
-
- ========================================================
- EndComment
-
- ;------ If CapsLock key is on then override default login
-
- Logged = False
- SkipError = False
-
- if CapsLock
- CapsLock Off
- else
- UserName = ParamStr(2)
- if UserName = '' then UserName = ReadEnv('USERNAME')
- if UserName > ''
- OldPass = ParamStr(3)
- if OldPass = '' then OldPass = ReadEnv('PASSWORD')
- if OldPass > ''
- SkipError = True
- Login (UserName,OldPass)
- SkipError = False
- if PasswordNeedsChanged
- Logged = False
- Suggest 'C'
- endif
- endif
- endif
- endif
-
- ;------ Fills station to 3 digits. Example: 004
-
- Station = Str(NovConnection)
- while length(Station) < 3
- Station = '0' + Station
- endwhile
-
- ;------ Read network address
-
- NetAddress = NovStationAddress (NovConnection)
-
- ;------ Select colors and prepare screen
-
- if not Logged
- if ColorScreen
- TextColor White Red
- BoxBorderColor Green Brown
- BoxInsideColor Black Brown
- ClearScreen 176
- ClockColor Black Brown
- TextColor Black Green
- BoxHeaderColor Yellow Mag
- Shadow
- else
- TextColor Grey Black
- ClearScreen 176
- TextColor Black Grey
- BoxBorderColor Black Grey
- BoxInsideColor Black Grey
- BoxHeaderColor Black Grey
- ClockColor Black Grey
- endif
- BlankMessage = 'Netware Login'
- ClockMode = 262
- GotoXY 1 25
- ClearLine
- WriteCenter "Computer Tyme Master Network Login Menu"
- SingleLineBox
- Explode Off
- ShadowColor Grey Red
- if ColorScreen
- DrawBox 3 2 74 5
- ClockPos 42 5
- TextColor Blue Brown
- else
- DrawBox 3 2 76 5
- ClockPos 44 5
- endif
- WriteCenter 'Computer Tyme Software Development Laboratory'
- Writeln
- TextColor Black Brown
- WriteCenter '───────────────────────────────────────────────────────'
- Writeln
- TextColor Black Brown
- Write " (C) 1990 by Marc Perkel"
- DoubleLineBox
- BlankTime = 10
-
- Explode On
- BlockBox
- BoxBorderColor Green Blue
- BoxInsideColor Yellow Blue
- BoxHeader = " Station Information "
- if ColorScreen
- DrawBox 39 17 38 6
- TextColor Yellow Blue
- else
- DrawBox 41 17 38 6
- TextColor Grey Black
- endif
-
- Writeln ' Server: ' MyServer
- Writeln ' Network: ' NetAddress
- Writeln ' Connection: ' Station
- Write ' DOS Version: ' DosVersionString
-
- ChooseOption
-
- EraseTopWindow
- EraseTopWindow
- EraseTopWindow
- TextColor Grey Black
- ClearScreen
- endif
-
- UserName = NovMyLoginName
-
- Comment
- ========================================================
-
- Here we set a different directory for a program depending on if we
- have a color or monochrome monitor.
-
- ========================================================
- EndComment
-
- if VideoMode = Mono
- SmartDir = 'F:\PUBLIC\MSMART'
- else
- SmartDir = 'F:\PUBLIC\CSMART'
- endif
-
- ;----- You can't assume that you have an F: drive unless you map it.
-
- NovMapDrive ('F','SYS:\LOGIN')
-
- ;----- Here we calculate a home directory for each user.
-
- HomeDir = 'F:\HOME\' + UserName
- if UserName = 'SUPERVISOR' then HomeDir = 'F:\SYSTEM'
- if not ExistDir(HomeDir) then HomeDir = 'F:\PUBLIC\APPS'
-
- Comment
- ========================================================
-
- Here we calulate the the name of the dos directory that matches the
- version of dos we are running.
-
- ========================================================
- EndComment
-
- DosDir = 'F:\PUBLIC\DOSV' + DosVersionString
-
- Comment
- ========================================================
-
- Here's where we map our drives. This does not set the search path.
- You set that explicitly by writing to the PATH environment variable.
-
- Drive map commands may contain server and volume referrences:
-
- MovMapDrive('I','TYME/VOL1:SERVICE')
-
- ========================================================
- EndComment
-
- NovMapDrive ('Z',HomeDir)
- NovMapDrive ('Y','F:\PUBLIC\APPS')
- NovMapDrive ('X',DosDir)
- NovMapDrive ('W','F:\PUBLIC\UTIL')
- NovMapDrive ('P','F:\PUBLIC')
- NovMapDrive ('U','F:\SYSTEM')
- NovMapDrive ('L','F:\LOGIN')
- if MyServer = 'TYME'
- NovMapDrive ('I','VOL1:')
- endif
- if (MyServer = 'TYME') or (MyServer = 'MARX')
- NovMapDrive ('S',SmartDir)
- endif
-
- if ExistDir (HomeDir + '\TP6') then NovMapDrive ('T',HomeDir + '\TP6')
-
- ;------ Here's where we set master environment variable strings
-
- SetEnv ('PASSWORD=')
- SetEnv ('NET=')
- SetEnv ('USERNAME=' + UserName)
- SetEnv ('STATION=' + Station)
- if Shell <> 'C:\COMMAND.COM' then SetEnv ('COMSPEC=X:COMMAND.COM')
- SetEnv ('PROMPT=$e[1;33m$p: $e[0;32m')
- SetEnv ('PD.EXE=/$Z:PD.PIC')
- SetEnv ('MXCTL=/C')
- SetEnv ('MXECHO=OFF')
-
- Comment
- ========================================================
-
- If a TEMP environment variable is set, MarxMenu will use it for
- temporary batch files. This is compatible with DOS 5 and Windows
- conventions. The users should be given full access rights to this
- directory. I'm using \TMPFILES for my network.
-
- ========================================================
- EndComment
-
- if ExistDir('\TMPFILES') then SetEnv('TEMP=' + CleanFileName('\TMPFILES'))
-
- SetEnv ('PATH=T:.;Z:.;Y:.;X:.;W:.;P:.;U:.;S:.;')
-
- FixPath ;Verifies all search paths exist
-
- ChDir (HomeDir)
-
- Comment
- ========================================================
-
- Opens a semaphore that XMETER can read.
- To see how many users are users are on with XMETER type:
- XMETER LOGIN /U
-
- ========================================================
- EndComment
-
- NovOpenSemaphore ('XM-LOGIN',0)
-
- ;------ LOGIN is set to BOOTUP if logging in for the first time
-
- if UpperCase(ReadEnv('BOOTUP')) <> 'LOGIN' then ExitMenu
-
- Comment
- ========================================================
-
- In order to load TSRs, MarxMenu writes a temporary batch file and
- exits. The STARTUP.BAT file then jumps to this batch file.
-
- ========================================================
- EndComment
-
- ;------ Create temporary batch file for rest of login sequence
-
-
- BatName = 'Y:' + NamePart(BatFileName) + '.BAT'
- SetEnv ('BOOTUP=' + BatName)
- FileAssign(BatFile,BatName)
- FileCreate(BatFile)
-
- if DosVersionString < '3.30'
- WriteBat('ECHO OFF')
- else
- WriteBat('@ECHO OFF')
- endif
- WriteBat ('SET BOOTUP=')
- WriteBat ('MARK > NUL')
-
- ;----- Load Lan Assist
-
- if NovInGroup ('LANASSIST')
- WriteBat ('P:LA\LA +N >NUL')
- endif
-
- Comment
- ================================================================
-
- This next section deals with running special programs bases on the
- physical station number rather than by user. This deals with special
- hardware that needs software drivers loaded.
-
- ================================================================
- EndComment
-
- ;----- CD ROM Machine
-
- ;if NetAddress = '255:2'
- ; WriteBat ('CD\PUBLIC\MA')
- ; WriteBat ('MSCDEX.EXE /D:MSCD003 /M:12')
- ; WriteBat ('MAR C:\ RW=/ /C')
- ;endif
-
- ;----- Vicki's Printer
-
- if NetAddress = '255:65'
- WriteBat('P:PA\PA P=1 M=200 T=10 Q1=TYME/VICKI')
- Capture('VICKI',1)
- endif
-
- ;----- Grace's Printer
-
- if NetAddress = '255:68'
- WriteBat('P:PA\PA P=1 M=200 T=10 Q1=TYME/GRACE')
- Capture('GRACE',1)
- endif
-
- ;----- Nita's Printer
-
- if NetAddress = '255:E8'
- WriteBat('P:PA\PA P=1 M=200 T=10 Q1=TYME/NITA')
- Capture('NITA',1)
- endif
-
- Comment
- ================================================================
-
- This next section deals with running special programs bases on the
- users preferrences.
-
- ================================================================
- EndComment
-
- if UserName = 'MARC'
- WriteBat('KBD 6 NumOff');
- Capture('DOT',1)
- Capture('LASER',2)
- ChDir('TP6')
- endif
-
- if UserName = 'VICKI'
- Capture('LASER',2)
- WriteBat('KBD 6 NumOn CR');
- WriteBat('MAP ROOT C:=Z:')
- WriteBat('MOUSE')
- endif
-
- if UserName = 'KEVIN'
- WriteBat('KBD 0,0 NumOn');
- Capture('LASER',1)
- Capture('DOT',2)
- SetEnv('PROMPT=($p)')
- SetEnv('PATH=' + ReadEnv( 'Path' ) + ';f:\home\kevin\brief' )
- ChDir('MARX')
- endif
-
- if UserName = '386'
- WriteBat('KBD 6 NumOff');
- Capture('DOT',1)
- Capture('LASER',2)
- endif
-
- if UserName = 'TBBS'
- Capture('DOT',1)
- Capture('LASER',2)
- ChDir('I:\BBS\TBBS')
- NovMapDrive('H','I:')
- SetEnv('D.EXE=/O/I')
- WriteBat('CASTOFF')
- WriteBat('DROPTO ' + BatName + ' R')
- endif
-
- if UserName = 'GRACE'
- WriteBat('KBD 6 NumOn');
- Capture('LASER',2)
- endif
-
- if UserName = 'NITA'
- WriteBat('KBD 6 NumOn CapsOn');
- Capture('LASER',2)
- endif
-
- if UserName = 'WORK'
- WriteBat('KBD 6 NumOff');
- Capture('DOT',1)
- Capture('LASER',2)
- endif
-
- ;------ Load SideKick if in Sidekick Group
-
- if NovInGroup 'SIDEKICK'
- WriteBat ('KBD CR');
- WriteBat ('SWAPSK/N/G/D' + HomeDir + ' >NUL')
- WriteBat ('SK')
- WriteBat ('CLS')
- endif
-
-
- ;------ Load SideKick 2 if in SK2 Group
-
- if NovInGroup 'SK2'
- WriteBat ('CD SK2')
- WriteBat ('SK2')
- WriteBat ('CD ..')
- endif
-
-
- Comment
- ================================================================
-
- The batch file ends by jumping to personal menu, if there is one, or
- the default menu if there isn't. DROPTO.BAT is used to erase the
- temporary batch file that this menu creates.
-
- ================================================================
- EndComment
-
- WriteBat ('DROPTO ' + BatName + ' MARX TYME')
-
- FileClose(BatFile)
-
- ExitMenu
-
-
- ;----- Procedure Definitions
-
- Procedure WriteBat (BatLine)
- FileWriteln(BatFile,BatLine)
- EndProc
-
-
- Procedure Pause
- WriteBat ('PAUSE')
- EndProc
-
-
- Procedure Capture (Queue, PrinterPort)
- var PortSt
- PortSt = Str(PrinterPort)
- WriteBat ('P:CAPTURE Q=' + Queue + ' C=1 NB NFF TI=5 L=' + PortSt + '>NUL')
- EndProc
-
- Comment
- ========================================================
-
- A list is created in the \LOGIN directory containing the names of
- users who want to load sidekick. The name of the file is SIDEKICK.LST
- and looks like:
-
- MARC
- VICKI
- GRACE
-
- ========================================================
- EndComment
-
- Procedure ChooseOption
- var Ch
- repeat
- DrawBox 3 17 26 5
- UseArrows
- InverseColor Yellow Cyan
- Writeln ' L - Login to Network'
- Writeln ' C - Change Password'
- Write ' S - Select Server'
- Ch = UpperCase(ReadKey)
- if (Ch = 'L') or (Ch = 'C') or (Ch = 'S')
- EraseTopWindow
- if Ch = 'L'
- LoginToNetwork (False)
- endif
- if Ch = 'C'
- LoginToNetwork (True)
- endif
- if Ch = 'S'
- SelectServer
- endif
- endif
- until Logged
- EndProc
-
-
- Procedure Warning (St)
- BoxHeader ' Warning '
- DrawBox 3 17 length(St) + 4 3
- Write Char(7) ' ' St
- Wait 300
- EraseTopWindow
- EndProc
-
-
- Procedure LoginToNetwork (CP)
- var NewPassVerify
- BoxHeader = ' Logging into Server * ' + MyServer + ' '
- DrawBox 3 10 50 4
- UseArrows Off
- Security
- repeat
- if UserName = ''
- Write ' Name: '
- UserName = UpperCase(Readln)
- Writeln
- endif
- Write ' Password: '
- OldPass = UpperCase(Readln)
- Write CR
- ClearLine
- Login (UserName,OldPass)
- if not CP
- CP = PasswordNeedsChanged
- if CP then Warning('Time to change your password!')
- endif
- if CP
- if LastKey <> Esc
- repeat
- Write ' New Password: '
- NewPass = UpperCase(Readln)
- Write CR
- ClearLine
- if NewPass = OldPass then Warning('Select a NEW Password!')
- until NewPass <> OldPass
- endif
- if LastKey <> Esc
- Write ' Verify: '
- NewPassVerify = UpperCase(Readln)
- Write CR
- ClearLine
- if NewPass = NewPassVerify
- NovChangePassword (OldPass,NewPass)
- if NovResult <> 0
- Warning ('Password Change Failed!')
- Logged = False
- endif
- else
- Warning('Password Typed Wrong!')
- Logged = False
- endif
- endif
- endif
- ClearScreen
- if not Logged
- UserName = ''
- endif
- until (LastKey = Esc) or Logged
- EraseTopWindow
- EndProc
-
-
- Procedure Login (User, Pass)
- if UseMarxLogin
- NovLogin (User, Pass)
- Logged = NovResult = 0
- else
- ClearScreenFirst Off
- UseCommand On
- StuffKbd = Pass + CR
- Execute ('LOGIN.EXE ' + MyServer + '/' + User + '>nul')
- Logged = ExistDir ('F:\SYSTEM')
- endif
- if not Logged and not SkipError then Warning('Login Failed!')
- EndProc
-
-
- Procedure PasswordNeedsChanged
- var X
- X = NovPasswordExpDate (UserName)
- if X = 0 then Return False
- Return (X - Today) / SecondsInDay <= 5
- EndProc
-
-
- Procedure SelectServer
- var Servers
- NovServers(Servers)
- DrawBox 25 9 20 NumberOfElements (Servers) + 2
- MyServer = PickOne (Servers)
- NovSetPrimaryServer (MyServer)
- EraseTopWindow
- EndProc